package cn.tedu._05weibo.exception;

import cn.tedu._05weibo.common.response.JsonResult;
import cn.tedu._05weibo.common.response.StatusCode;
import com.sun.media.sound.JARSoundbankReader;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * ControllerAdvice:
 * 该注解标识此类为全局异常处理器类
 * 当控制器中抛出异常时。框架会先检查有没有定义全局异常处理器
 * 如果有，由该类处理
 * 如果没有，由SpringMVC默认的异常处理机制
 * RestControllerAdvice=ControllerAdvice+ResponseBody
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    public JsonResult dohandleIllegalArgumentException(IllegalArgumentException ex) {
        //获取异常提示信息
        String message = ex.getMessage();
        log.error("IllegalArgumentException:" + message);

        //{state:2002,message:"操作失败"，data：异常提示消息}
        return new JsonResult(StatusCode.OPERATION_FAILED, message);
    }

    //处理MethodArgumentNotValidException异常
    @ExceptionHandler
    public JsonResult doHandleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
//        return new JsonResult(3002,"请求参数错误");
        //ex.getFieldError().getDefaultMessage():获取@NotNull(message="必须提交用户名")中的message的消息
        String message = ex.getFieldError().getDefaultMessage();
        return new JsonResult(StatusCode.VALIDATE_ERROR, message);
    }

    //处理RuntimeException异常【父类处理异常方法】
    public JsonResult doHandleRuntimeException(RuntimeException ex) {
        String message = ex.getMessage();
        log.error("RuntimeException:" + message);
        return new JsonResult(StatusCode.OPERATION_FAILED, message);
    }


    //项目完成开发完成后，最后会添加处理所有异常方法
    //添加此方法后，不会出现500的HTTP状态码
//    @ExceptionHandler
//    public JsonResult doHandleThrowable(Throwable ex){
//        String message=ex.getMessage();
//        log.error("Throwable:"+message);
//        return new JsonResult(StatusCode.THROWABLE_ERROR,message);
//    }
}
